package com.jiepos.mpos.pay;

import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.jiepos.mpos.common.constant.SystemConstant;
import com.jiepos.mpos.core.util.StringUtils;



/**
 * 标题: 定时查询服务 查询3分钟内未收到异步应答的记录，
 * 按照5分钟、10分钟、15分钟、30分钟、1小时、2小时查询六次，
 * 若还查不到，支付结果不更新。
 * 模块: 支付平台 版权: Copyright (c) 2017 江苏杰博实信息技术有限公司
 * @author 杨剑武
 * @version 1.0
 * @since 2017年10月9日 下午15:10:57 
 * @history（历次修订内容、修订人、修订时间等）
 */

public class PayQueryService {
	private static final Logger _log = LoggerFactory.getLogger(PayQueryService.class);

	@Autowired
	private AppLogTransJnlsPayService appLogTransJnlsPayService;

	@Autowired
	private NoticeService noticeService;
	
	@Autowired
	private MainBusinessService mainBusinessService;

	public void process() {
		_log.info("定时任务主动查询开始:");
		List<Map<String, String>> list = appLogTransJnlsPayService.getErrStatList();
		if (!StringUtils.isEmpty(list) && !list.isEmpty()) {
			_log.info("渠道主动查询符合条件交易记录[{}]",list);
			int size = list.size();
			for (int i = 0; i < size; i++) {
				queryService(list.get(i));
			}
		}else{
			_log.warn("渠道主动查询无符合条件交易记录!");
		}
		_log.info("定时任务主动查询结束!");
	}

	private void queryService(Map<String, String> reqMap) {
		Map<String, String> resqMap = CommonService.getPayServices().get(reqMap.get("trf_channel_id"))
				.queryChannelOrder(reqMap);
		if (!StringUtils.isEmpty(resqMap)) {
			if (SystemConstant.RSPCODE_SUCCESS.equals(resqMap.get("rspcode"))
					&& SystemConstant.AUDIT_STL_0.equals(resqMap.get("stlst"))
					&& SystemConstant.RSPCODE_XX.equals(reqMap.get("rspcode"))) {// 支付状态为00,清算状态为0
				appLogTransJnlsPayService.update(reqMap.get("loc_dt"),reqMap.get("loc_trace_no"), resqMap.get("stlst"), null,
						SystemConstant.RSPCODE_SUCCESS, SystemConstant.RSPCODE_SUCCESS_PAY, "1", resqMap.get("complete_dt"), resqMap.get("complete_ts"), resqMap.get("trf_trace_no")
						, resqMap.get("midfee"), resqMap.get("rcvfee"), "1");
			} else if (SystemConstant.RSPCODE_SUCCESS.equals(resqMap.get("rspcode"))
					&& SystemConstant.AUDIT_STL_1.equals(resqMap.get("stlst"))) {// 支付状态为00,清算状态为1
				noticeService.noticeUpdate(resqMap);
				_log.info("流水号[{}]主动结果查询成功", reqMap.get("loc_trace_no"));
			} else if (SystemConstant.RSPCODE_ERROR.equals(resqMap.get("rspcode"))) {// 交易未知
				appLogTransJnlsPayService.update(reqMap.get("loc_dt"),reqMap.get("loc_trace_no"), null, SystemConstant.RSPCODE_ERROR,
						resqMap.get("errorCode"), resqMap.get("msg"), "1", null, null, null, null, null, null);
			} else if (SystemConstant.RSPCODE_SUCCESS.equals(resqMap.get("rspcode"))
					&& SystemConstant.AUDIT_STL_2.equals(resqMap.get("stlst"))
					&& SystemConstant.RSPCODE_XX.equals(reqMap.get("rspcode"))) {// 支付状态为00,同步清算状态为2
				appLogTransJnlsPayService.update(reqMap.get("loc_dt"),reqMap.get("loc_trace_no"), resqMap.get("stlst"), null,
						SystemConstant.RSPCODE_SUCCESS, SystemConstant.RSPCODE_SUCCESS_PAY, "3", resqMap.get("complete_dt"), resqMap.get("complete_ts"), resqMap.get("trf_trace_no")
						, resqMap.get("midfee"), resqMap.get("rcvfee"), "1");
			}else {
				appLogTransJnlsPayService.update(reqMap.get("loc_dt"),reqMap.get("loc_trace_no"), null, null, null, null, "1", null, null, null, null, null, null);
			}
			
			_log.info("支付成功异步通知管理系统 loc_trace_no=" + reqMap.get("loc_trace_no"));
			try {
				mainBusinessService.asyncNotifyMpos(reqMap.get("loc_trace_no"));
			} catch (Exception e) {
				_log.info("支付成功异步通知管理系统失败");
			}
		} else {
			appLogTransJnlsPayService.update(reqMap.get("loc_dt"),reqMap.get("loc_trace_no"), null, null, null, null, "1", null, null, null, null, null, null);
			_log.warn("本地流水记录[{}]渠道主动查询失败!", reqMap);
		}
	}
}
